table of contents
MSGOP(2) | Podręcznik programisty Linuksa | MSGOP(2) |
NAZWA¶
msgop - przekazywanie komunikatów
SKŁADNIA¶
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg);
ssize_t msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg);
OPIS¶
W celu wysłania lub odebrania komunikatu, proces powinien zaalokować strukturę danych o następującej postaci ogólnej:
struct msgbuf {
long mtype; /* rodzaj komunikatu, musi być > 0 */
char mtext[1]; /* przekazywane dane */
};
Pole mtext jest tablicą (lub inna strukturą) o rozmiarze określonym przez msgsz, będącym nieujemną liczbą całkowitą. Dozwolone są komunikaty o zerowej długości (tzn. nie zawierające pola mtext) Wartość pola mtype musi być liczbą ściśle dodatnią, która może służyć procesowi odbierającemu komunikaty do filtrowania kolejki. (zobacz część dotyczącą msgrcv).
Proces wywołujący funkcję musi mieć prawo zapisu do kolejki, aby wysłać komunikat, natomiast prawo odczytu jest niezbędne, aby komunikat odebrać.
Wywołanie systemowe msgsnd dołącza kopię komunikatu wskazywanego przez msgp do kolejki o identyfikatorze określonym przez msqid.
Gdy w kolejce jest dość miejsca, msgsnd kończy się pomyślnie natychmiast (Pojemność kolejki określona jest w polu msg_bytes struktury danych stowarzyszonej z kolejką. Podczas tworzenia kolejki nadawana jest mu wartość inicjalna wynosząca MSGMNB bajtów, lecz ograniczenie to może zostać zmienione za pomocą msgctl.) Gdy w kolejce nie ma dość miejsca, to domyślne zachowanie msgsnd polega na wstrzymaniu wykonywania funkcji do czasu, gdy miejsce stanie się dostępne. If Ustawienie w msgflg znacznika IPC_NOWAIT spowoduje, że zamiast tego wywołanie systemowe zakończy się niepomyślnie, zgłaszając błąd EAGAIN.
Wstrzymane wywołanie msgsnd może również zakończyć się niepomyślnie, gdy kolejka zostanie usunięta (i wtedy wywołanie to powoduje przypisanie zmiennej errno wartości EIDRM), lub gdy zostanie przechwycony sygnał (i wtedy wywołanie to powoduje przypisanie zmiennej errno wartości EINTR). (msgsnd i msgrcv po przerwaniu przez obsługę sygnału nie są nigdy automatycznie restartowane, nie zależnie od ustawienia znacznika SA_RESTART podczas ustanaiwiania funkcji obsługi sygnału.)
W wyniku pomyślnego wykonania operacji, struktura danych opisująca kolejkę komunikatów zostanie zmodyfikowana następująco:
- msg_lspid przypisany zostanie identyfikator procesu wykonującego tę operację.
- msg_qnum zostanie zwiększone o 1
- msg_stime zostanie przypisany aktualny czas.
Wywołanie systemowe msgrcv odczyta komunikat z kolejki wskazanej przez parametr msqid do struktury msgbuf wskazywanej przez parametr msgp usuwając odczytany komunikat z kolejki.
Parametr msgsz określa maksymalny rozmiar (w bajtach) pola mtext struktury wskazywanej przez parametr msgp. Jeśli dane komunikatu zajmują więcej bajtów, niż msgsz, a parametr msgflg zawiera znacznik MSG_NOERROR, wówczas dane komunikatu zostaną obcięte (obcięta część zostanie utracona). Jeśli znacznik nie jest ustawiony a (a komunikat jest za długi), wówczas nie zostanie on usunięty z kolejki, natomiast system zgłosi błąd a zmiennej errno zostanie przypisana wartość E2BIG.
Parametr msgtyp określa rodzaj komunikatu w następujący sposób:
- Jeśli msgtyp jest równy 0, to czytany jest pierwszy dostępny komunikat w kolejce (czyli najdawniej wysłany).
- Jeśli msgtyp ma wartość większą niż 0, to z kolejki odczytywany jest pierwszy komunikat tego typu, chyba że w parametrze msgflg zostanie ustawiony znacznik MSG_EXCEPT, kiedy to z kolejki zostanie odczytany pierwszy komunikat o typie innym niż podany w msgtyp.
- Jeśli msgtyp ma wartość mniejszą niż 0, to z kolejki zostanie odczytany pierwszy komunikat o najniższym numerze typu, o ile jest on mniejszy lub równy wartości bezwzględnej msgtyp .
Parametr msgflg zawiera bitową alternatywę (OR) żadnego, jednego lub więcej spośród następujących znaczników:
- IPC_NOWAIT Wywołanie nie będzie wstrzymywać pracy procesu, jeśli w kolejce nie ma komunikatów odpowiedniego typu. Wywołanie systemowe zgłosi wówczas błąd, przypisując zmiennej errno wartość ENOMSG.
- MSG_EXCEPT Używane jest wtedy, gdy msgtyp ma wartość większą niż 0, spowoduje odczytanie z kolejki pierwszego komunikatu innego typu, niż msgtyp.
- MSG_NOERROR Spowoduje obcięcie komunikatu, jeśli jego dane są dłuższe niż msgsz bajtów.
Jeśli w kolejce nie ma komunikatu spełniającego te warunki, zaś znacznik IPC_NOWAIT nie został przekazany w msgflg, to proces zostanie wstrzymany, dopóki nie nastąpi jedno z poniższych zdarzeń:
- Komunikat odpowiedniego typu zostanie umieszczony w kolejce.
- Kolejka zostanie usunięta z systemu. W tym przypadku wywołanie systemowe zgłosi błąd, przypisując zmiennej errno wartość EIDRM.
- Proces wywołujący otrzyma sygnał wymagający przechwycenia. W tym przypadku wywołanie systemowe zgłosi błąd, przypisując zmiennej errno wartość EINTR.
Jeśli operacja zakończy się pomyślnie, to struktura danych opisująca kolejkę zostanie następująco zmodyfikowana:
- msg_lrpid przyjmie wartość równą identyfikatorowi wołającego procesu
- msg_qnum zostanie zmniejszone o 1.
- msg_rtime zostanie przypisany aktualny czas.
WARTOŚĆ ZWRACANA¶
W przypadku niepowodzenia, obydwa wywołania zwrócą -1 i przypiszą zmiennej errno wartość określającą rodzaj błędu. W przeciwnym przypadku, msgsnd zwróci 0, zaś msgrvc zwróci liczbę bajtów skopiowanych z kolejki do tablicy mtext.
BŁĘDY¶
Jeśli wywołanie msgsnd nie powiedzie się, to zmienna errno przyjmie jedną z poniższych wartości:
- EAGAIN
- Komunikat nie może zostać wysłany do kolejki, z powodu ograniczenia msg_qbytes, a znacznik IPC_NOWAIT został przekazany w parametrze mgsflg.
- EACCES
- Proces nie ma prawa zapisu do kolejki komunikatów.
- EFAULT
- dres wskazywany przez msgp jest niedostępny.
- EIDRM
- Kolejka została w międzyczasie usunięta.
- EINTR
- Podczas oczekiwania na zwolnienie miejsca w kolejce, proces przechwycił sygnał.
- EINVAL
- Niewłaściwa wartość msqid, mtype (powinna być dodatnia) lub msgsz (powinna być większa lub równa 0 i mniejsza lub równa MSGMAX).
- ENOMEM
- Brak w systemie pamięci na skopiowanie podanego msgbuf.
Jeśli wywołanie msgrcv nie powiedzie się, to zmiennej errno zostanie przypisana jedna z poniższych wartości:
- E2BIG
- Tekst komunikatu jest dłuższy niż msgsz , zaś znacznik MSG_NOERROR nie został w parametrze msgflg ustawiony.
- EACCES
- Proces nie ma prawa do odczytu danej kolejki komunikatów.
- EFAULT
- Adres wskazywany przez msgp jest niedostępny.
- EIDRM
- Proces oczekiwał na komunikat, ale w międzyczasie kolejka została usunięta.
- EINTR
- Proces oczekiwał na komunikat, ale dotarł do niego jakiś wymagający obsłużenia sygnał.
- EINVAL
- Niewłaściwa wartość msgqid lub msgsz (powinna być większa lub równa 0).
- ENOMSG
- Znacznik IPC_NOWAIT został przekazany w msgflg , ale w kolejce nie ma komunikatu żądanego typu.
UWAGI¶
Wywołanie msgsnd obowiązują następujące ograniczenia systemowe:
- MSGMAX
- Maksymalny rozmiar danych komunikatu: ta implementacja ogranicza wielkość do 8192 bajty.
- MSGMNB
- Domyślny maksymalny łączny rozmiar (w bajtach) wszystkich komunikatów w kolejce: 16384 bajty. Administrator systemu może przekroczyć to ograniczenie, przy pomocy wywołania msgctl.
W tej implementacji nie ma jawnego systemowego ograniczenia liczby komunikatów przechowywanych w kolejce (MSGTQL) i na rozmiar obszaru (w bajtach) przeznaczonego na komunikaty (MSGPOOL).
ZGODNE Z¶
SVr4, SVID.
UWAGA¶
Parametr będący wskaźnikiem jest w ibc4, libc5, glibc 2.0 i glibc 2.1 zadeclarowany jako struct msgbuf *. W glibc 2.2 jest zadeklarowany jako void * (const void * dla msgsnd()), zgodnie z SUSv2.
ZOBACZ TAKŻE¶
2002-06-01 | Linux 2.4.18 |